#include<bits/stdc++.h>
using namespace std;

// vector<int> findSubstring(string s, vector<string> &words)
// {
//     unordered_map<string, int> hash;
//     unordered_map<string, int> hash1;
//     string resstr;
//     vector<int> res;
//     int wordsize = words[0].size();
//     for (auto &str : words)
//     {
//         hash[str]++;
//     }
//     int left = 0, right = 0;
//     int count = 0;
//     while (count < words.size())
//     {
//         string sub = s.substr(right, wordsize);
//         right += wordsize;
//         resstr += sub;
//         hash1[sub]++;
//         count++;
//     }

//     while (right < s.size())
//     {
//         if (hash == hash1)
//             res.push_back(left);
//         resstr.erase(left, 1);
//         left++;
//         resstr.push_back(s[right]);
//         right++;
//         hash1.clear();
//         int pos = 0;
//         for (int i = 0; i < words.size(); i++)
//         {
//             string sub = resstr.substr(pos, wordsize);
//             pos += wordsize;
//             hash1[sub]++;
//         }
//     }
//     if (hash == hash1)
//         res.push_back(left);
//     return res;
// }
vector<int> findSubstring(string s, vector<string> &words)
{
    unordered_map<string, int> hash;
    unordered_map<string, int> hash1;
    // string resstr;
    vector<int> res;
    int wordsize = words[0].size();
    for (auto &str : words)
    {
        hash[str]++;
    }
    int left = 0, right = 0;
    int count = 0;
    for (int i = 0; i < wordsize; i++)
    {
        left = i, right = i;
        while (right < s.size())
        {
            if (count == words.size())
                res.push_back(left);
            string sub = s.substr(right, wordsize);
            right += wordsize;
            hash1[sub]++;
            if (hash.find(sub) != hash.end() && hash1[sub] <= hash[sub])
                count++;
            if (right - left > words.size() * wordsize)
            {
                string sub = s.substr(left, wordsize);
                hash1[sub]--;
                if (hash.find(sub) != hash.end() && hash1[sub] < hash[sub])
                    count--;
                if (hash1[sub] == 0)
                    hash1.erase(sub);
                left += wordsize;
            }
        }
        if (count == words.size())
            res.push_back(left);
    }
    return res;
}
int main()
{
    string s = "aaaaaaaaaaaaaa";
    vector<string>  words= {"aa","aa"};
    findSubstring(s,words);
}